# 集合本身是可变类型,但python要求放入集合中的元素必须是不可变的类型的
# 不可变类型:元组,int float str boolean
# 可哈希hashable = 不可变     不可哈希unhashable = 可变
# 集合中的元素无序且唯一
# 1.创建集合
# ①使用{}创建集合
s1 = {1}
print(s1, type(s1))  # {1} <class 'set'>
s2 = {1, "a", ("p", 2, 3), 1}  # 唯一且无序
print(s2, type(s2))  # {1, 'a', ('p', 2, 3)} <class 'set'>
s3 = set()  # 空集合 不可使用{}创建空集合
s4 = {}  # 空字典
print(s3, type(s3), s4, type(s4))  # set() <class 'set'> {} <class 'dict'>
# ②使用set(iterable)函数创建非空集合
s1 = set([1, 2, 3, 2, 1])
print(s1)  # {1, 2, 3}
s2 = set("string")
print(s2)  # {'g', 'r', 't', 'n', 's', 'i'}

# 2.集合的常见操作
s1 = {1, 2, 3, 4, 4}
# ①add(x)    向集合中添加元素x,x已存在时不做处理
s1.add(5)
print(s1)  # {1, 2, 3, 4, 5}
# ②remove(x) 删除集合中的元素x,若x不存在则抛出KeyError异常
s1.remove(5)  # {1, 2, 3, 4, 5}
print(s1)
# ③discard(x)删除集合中的x,若x不存在不做处理
s1.discard(5)
print(s1)  # {1, 2, 3, 4}
# ④pop()    随机返回集合中的一个元素，同时删除该元素;若集合为空则抛出KeyError异常
s1.pop()
print(s1)  # {2, 3, 4}
# ⑤copy()   复制集合，返回值为集合
s2 = s1.copy()
print(s2)  # {2, 3, 4}
# ⑥clear()  清空集合
s2.clear()
print(s2)  # set()
# ⑦isdisjoint(T)    判断集合与集合T是否没有相同的元素,没有返回True,有返回False
s2.add(1)
print(f's1:{s1},s2:{s2},isdisjoint:{s1.isdisjoint(s2)}')
# s1:{2, 3, 4}, s2:{1}, isdisjoint:True  无相同的元素
s2.add(2)
print(f's1:{s1},s2:{s2},isdisjoint:{s1.isdisjoint(s2)}')
# s1:{2, 3, 4},s2:{1, 2},isdisjoint:False 有相同的元素
# ⑧del  删除整个集合
del s2, s1

# 3.集合推导式
# 语法：{表达式 for 迭代变量 in 可迭代对象 if 条件语句}   用来生成集合
list1 = [1, 2, 3, 4, 6, 7, 8]
set1 = {1, 2, 3, 4, 6, 7, 8}
new = {i for i in list1 if i > 5}
print(new)  # {8, 6, 7}
new = {i for i in set1 if i > 5}
print(new)  # {8, 6, 7}
